package com.nh.common.config;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

/**
 * @Author: LaoCao
 * @Date: 2023/3/16 15:00
 * @Version: 1.0
 **/
@Configuration
@Slf4j
public class MQConfig implements RabbitTemplate.ConfirmCallback,RabbitTemplate.ReturnCallback {

    @Resource
    private RabbitTemplate rabbitTemplate;

    // 修饰一个非静态的 void()方法,在服务器加载Servlet的时候运行，并且只会被服务器执行一次在构造函数之后执行，init()方法之前执行。
    @PostConstruct
    public void init(){
        rabbitTemplate.setConfirmCallback(this);
        rabbitTemplate.setReturnCallback(this);
    }

    // 回调方法：无论是否发送到交换机都会被回调
    // ack：true 表示发送到了交换机；false 表示未发送到交换机
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        if (ack){
            log.info("消息发送成功:" + JSON.toJSONString(correlationData));
        }else {
            log.info("消息发送失败:" + cause + "数据:" + JSON.toJSONString(correlationData));
        }
    }
    // 判断消息是否发送到了队列，如果发送到了队列，则不会调用这个方法；没有发送到队列则调用这个方法
    @Override
    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
        log.info("消息主体：" + new String(message.getBody()));
        log.info("响应码:" + replyCode);
        log.info("描述:" + replyText);
        log.info("消息使用的交换机:" + exchange);
        log.info("消息使用的路由键:" + routingKey);
    }
}
